home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / fpu881 / src6.zoo / cdiv.s < prev    next >
Text File  |  1991-09-24  |  4KB  |  138 lines

  1. # double precision floating point stuff for Atari-gcc using the SFP004
  2. # developed with gas
  3. #
  4. # double precision complex division
  5. # makes use of many of the 68881 regs for high internal precision and speed
  6. #
  7. # M. Ritzert (mjr at dmzrzu71)
  8. #
  9. # 12.10.1990
  10. #
  11. # addresses of the 68881 data port. This choice is fastest when much data is
  12. # transferred between the two processors.
  13.  
  14. comm =     -6
  15. resp =    -16
  16. zahl =      0
  17.  
  18. # waiting loop ...
  19. #
  20. # wait:
  21. # ww:    cmpiw    #0x8900,a1@(resp)
  22. #     beq    ww
  23. # is coded directly by
  24. #    .long    0x0c688900, 0xfff067f8
  25. # and
  26. # www:    tst.b    a1@(resp)
  27. #    bmi.b    www
  28. # is coded by
  29. #    .word    0x4a68,0xfff0,0x6bfa        | test
  30.  
  31.     .text; .even
  32.     .globl _cdiv
  33. _cdiv:
  34.     movel    a1,d0                | save a1 and return it finally
  35.     lea    0xfffa50,a0            | fpu address
  36.  
  37. # load floating point registers
  38.     movew    #0x5400,a0@(comm)        | real part of z1 to fp0
  39.     .long    0x0c688900, 0xfff067f8
  40.     movel    a7@(4),a0@            | load arg_hi
  41.     movel    a7@(8),a0@            | load arg_low
  42.  
  43.     movew    #0x5480,a0@(comm)        | imaginary part of z1 to fp1
  44.     .long    0x0c688900, 0xfff067f8
  45.     movel    a7@(12),a0@            | load arg_hi
  46.     movel    a7@(16),a0@            | load arg_low
  47.  
  48.     movew    #0x5500,a0@(comm)        | real part of z2 to fp2
  49.     .long    0x0c688900, 0xfff067f8
  50.     movel    a7@(20),a0@            | load arg_hi
  51.     movel    a7@(24),a0@            | load arg_low
  52.  
  53.     movew    #0x5580,a0@(comm)        | imaginary part of z2 to fp3
  54.     .long    0x0c688900, 0xfff067f8
  55.     movel    a7@(28),a0@            | load arg_hi
  56.     movel    a7@(32),a0@            | load arg_low
  57.  
  58. # do the division
  59.  
  60. #    movew    #%0000 0010 0000 0000,a0@(comm)    | copy fp0 to fp4 (a)
  61.     movew    #0x0200,a0@(comm)        | copy fp0 to fp4 (a)
  62.     .word    0x4a68,0xfff0,0x6bfa        | test
  63.  
  64. # compute denominator (square of divisor's absolute value)
  65. # result on fp5
  66.  
  67. #    movew    #%0000101010000000,a0@(comm)    | copy fp2 to fp5 (c)
  68.     movew    #0x0a80,a0@(comm)        | copy fp2 to fp5 (c)
  69.     .word    0x4a68,0xfff0,0x6bfa        | test
  70.  
  71. #    movew    #%000 010 101 010 0011,a0@(comm)    | mul fp2 -> fp5 (c*c)
  72.     movew    #0x0aa3,a0@(comm)        | mul fp2 -> fp5 (c*c)
  73.     .word    0x4a68,0xfff0,0x6bfa        | test
  74.  
  75. #    movew    #%000 011 110 0000000,a0@(comm)    | copy fp3 to fp6 (d)
  76.     movew    #0x0f00,a0@(comm)        | copy fp3 to fp6 (d)
  77.     .word    0x4a68,0xfff0,0x6bfa        | test
  78.  
  79. #    movew    #%000 011 110 0100011,a0@(comm)    | mul fp3 -> fp6 (d*d)
  80.     movew    #0x0f23,a0@(comm)        | mul fp3 -> fp6 (d*d)
  81.     .word    0x4a68,0xfff0,0x6bfa        | test
  82.  
  83. #    movew    #%000 110 101 0100010,a0@(comm)    | fp5 = fp5 + fp6
  84.     movew    #0x1aa2,a0@(comm)        | fp5 = fp5 + fp6
  85.     .word    0x4a68,0xfff0,0x6bfa        | test
  86.     
  87. # now compute the product
  88.  
  89. #    movew    #%000 010 100 0100011,a0@(comm)    | mul fp2 -> fp4 (a*c)
  90.     movew    #0x0a23,a0@(comm)        | mul fp2 -> fp4 (a*c)
  91.     .word    0x4a68,0xfff0,0x6bfa        | test
  92.  
  93. #    movew    #%000 011 000 0100011,a0@(comm)    | mul fp3 -> fp0 (a*d)
  94.     movew    #0x0c23,a0@(comm)        | mul fp3 -> fp0 (a*d)
  95.     .word    0x4a68,0xfff0,0x6bfa        | test
  96.  
  97. #    movew    #%000 001 010 0100011,a0@(comm)    | mul fp1 -> fp2 (b*c)
  98.     movew    #0x0523,a0@(comm)        | mul fp1 -> fp2 (b*c)
  99.     .word    0x4a68,0xfff0,0x6bfa        | test
  100.  
  101. #    movew    #%0000 0101 1010 0011,a0@(comm)    | mul fp1 -> fp3 (b*d)
  102.     movew    #0x05a3,a0@(comm)        | mul fp1 -> fp3 (b*d)
  103.     .word    0x4a68,0xfff0,0x6bfa        | test
  104.  
  105. #    movew    #%0000 1110 0010 0010,a0@(comm)    | fp4 = fp3 + fp4
  106.     movew    #0x0e22,a0@(comm)        | fp4 = fp3 + fp4
  107.     .word    0x4a68,0xfff0,0x6bfa        | test
  108.  
  109. #    movew    #%0001 0110 0010 0000,a0@(comm)    | fp4 = fp4 / fp5
  110.     movew    #0x1620,a0@(comm)        | fp4 = fp4 / fp5
  111.     .word    0x4a68,0xfff0,0x6bfa        | test
  112.  
  113. #    movew    #%0000 0001 0010 1000,a0@(comm)    | fp2 = fp2 - fp0
  114.     movew    #0x0128,a0@(comm)        | fp2 = fp2 - fp0
  115.     .word    0x4a68,0xfff0,0x6bfa        | test
  116.  
  117. #    movew    #%0001 0101 0010 0000,a0@(comm)    | fp2 = fp2 / fp5
  118.     movew    #0x1520,a0@(comm)        | fp2 = fp2 / fp5
  119.     .word    0x4a68,0xfff0,0x6bfa        | test
  120.  
  121. # return real part (fp4) and imaginery part (fp2)
  122.  
  123. #    movew    #%0111 0110 0000 0000,a0@(comm)    | fp4 -> d0
  124.     movew    #0x7600,a0@(comm)        | fp4 -> d0
  125.     .long    0x0c688900, 0xfff067f8
  126.     movel    a0@(zahl),a1@+
  127.     movel    a0@(zahl),a1@+
  128.  
  129. #    movew    #%0111 0101 0000 0000,a0@(comm)    | fp2 -> d1
  130.     movew    #0x7500,a0@(comm)        | fp2 -> d1
  131.     .long    0x0c688900, 0xfff067f8
  132.     movel    a0@(zahl),a1@+
  133.     movel    a0@(zahl),a1@+
  134.  
  135.     rts                    | sigh!
  136.  
  137.     
  138.